// TreeNode.h  
#ifndef TREE_NODE_H  
#define TREE_NODE_H  

#include "../include/StateVariables.h"  
#include <string>  
#include <iostream>

class TreeNode  
{  
private:  
    std::string name = "";              // 储存这个节点的名字
    int _state = StateVariables::INIT;  // 初始状态  
    TreeNode* f_next = nullptr;         // 失败子节点
    TreeNode* t_next = nullptr;         // 成功子节点

public:  
    TreeNode() {  
        // 可添加初始化代码  
    }   

    int work(){
        std::cout << name << " -> work" << std::endl;
        setState(StateVariables::RUNNING);  // 设置正在运行状态

        int ans = tick();
        if (ans == StateVariables::SUCCESS){
            std::cout << name << " -> SUCCESS" << std::endl;
        }
        else{
            std::cout << name << " -> FAILURE" << std::endl;
        }
        std::cout << std::endl;
        return ans;
    }

    // 这个是工作函数
    virtual int tick() = 0;
    
    virtual ~TreeNode() {  
        // 可添加清理代码  
        // 如果需要，释放指向的动态分配节点  
    }  

    // 设置名字
    void setName(std::string name_){
        name = name_;
    }

    // 获得名字
    std::string getName(){
        return name;
    }

    // 设置状态  
    void setState(int state) {  
        _state = state;  
    }  

    // 获取状态  
    int getState() const {  
        return _state;  
    }  

    // 设置下一个节点  
    void setFNext(TreeNode* next) {  
        f_next = next;  
    }  

    // 设置子节点  
    void setTNext(TreeNode* next) {  
        t_next = next;  
    }  

    // 获取下一个节点  
    TreeNode* getFnext() const {  
        return f_next;  
    }  

    // 获取下一个节点  
    TreeNode* getTnext() const {  
        return t_next;  
    }  

    // 获取子节点  
    TreeNode* getNext() const {  
        return t_next;  
    }  
};  

#endif // TREE_NODE_H


// 初始化节点
class RobotInit : public TreeNode
{
public:  
    RobotInit(){
        setName("init");
    }

    int tick() override ;
    ~RobotInit() override {}

};


// 移动
class RobotMove : public TreeNode
{
public: 
    RobotMove(){
        setName("move");
    }

    int tick() override ;
    ~RobotMove() override {}
};
